package com.cskaoyan.javase.oop1._7anonymous;

/**
 * @description: 匿名对象
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 匿名: 没有名字,对于对象来说"引用"是它的名字
 * 匿名对象: 就是没有引用指向它,孤零零的存在于堆上的对象
 *
 * 匿名对象的使用: 由于匿名对象,实际上就是"垃圾对象"
 *  所以需要在创建它的同时,就使用它,否则没有任何意义
 *  语法: new 类名(参数);
 *  创建后直接在后面"."或者作为方法的参数/返回值,必须直接使用
 *
 *  最常见的:
 *      1,用匿名对象作为方法的参数
 *      优点: 快捷简单方便,并且理论上来说,该匿名对象很快成为垃圾对象,能够更快的进行垃圾回收
 *      缺点: 一次性,只能用一次,后面再想用也用不了了
 *      以上,匿名对象应该在确定仅使用一次某个对象时,追求方便简洁的时候使用
 *          但是如果需要多次使用该对象,要避免使用匿名对象
 *      2,用匿名对象作为方法的返回值对象
 *      优点: 快捷简单方便,并且理论上来说,该匿名对象很快成为垃圾对象,能够更快的进行垃圾回收
 *      缺点: 一次性,只能用一次,后面再想用也用不了了
 *      以上,匿名对象应该在确定仅使用一次某个对象时,追求方便简洁的时候使用
 *          但是如果需要多次使用该对象,要避免使用匿名对象
 *
 * 方法的返回值类型写一个类名(引用数据类型)时,表示需要返回该类型的对象
 *
 */
public class Demo {
    public static void main(String[] args) {
        new Student().playGame();
        System.out.println(new Student().age);
        System.out.println(new Student(18).age);

        System.out.println("---------------------");
        test(new Student());
        test(new Student());
        test(new Student());
        test(new Student());
        test(new Student());

    }

    public static void test(Student s) {
        System.out.println("hello world" + s.name);
    }

    public static Student test(){
        //正常情况
        //Local variable 's' is redundant
        /*Student s = new Student();
        return s;*/

        //使用匿名对象
        return new Student();
    }

}

class Student {
    int age = 10;
    String name = "长风";

    public void playGame() {
        System.out.println("我喜欢玩游戏!");
    }

    public Student() {
    }

    public Student(int age) {
        this.age = age;
    }
}